package com.hyphenate.easeui.adapter;

import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.hyphenate.chat.EMChatRoom;
import com.hyphenate.chat.EMClient;
import com.hyphenate.chat.EMConversation;
import com.hyphenate.chat.EMConversation.EMConversationType;
import com.hyphenate.chat.EMGroup;
import com.hyphenate.chat.EMMessage;
import com.hyphenate.easeui.EaseConstant;
import com.hyphenate.easeui.R;
import com.hyphenate.easeui.dao.DaoHelper;
import com.hyphenate.easeui.dao.GroupChatBeanDao;
import com.hyphenate.easeui.dao.UserBeanDao;
import com.hyphenate.easeui.domain.EaseUser;
import com.hyphenate.easeui.model.GroupChatBean;
import com.hyphenate.easeui.model.UserBean;
import com.hyphenate.easeui.utils.DateUtils;
import com.hyphenate.easeui.utils.EaseCommonUtils;
import com.hyphenate.easeui.utils.EaseUserUtils;
import com.rockerhieu.emojicon.EmojiconTextView1;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 会话列表adapter
 *
 */
public class EaseConversationAdapater extends ArrayAdapter<EMConversation> {
    private static final String TAG = "ChatAllHistoryAdapter";
    private List<EMConversation> conversationList;
    private List<EMConversation> copyConversationList;
    private ConversationFilter conversationFilter;
    private boolean notiyfyByFilter;
    
    protected int primaryColor;
    protected int secondaryColor;
    protected int timeColor;
    protected int primarySize;
    protected int secondarySize;
    protected float timeSize;
    private List<String>toplist;
private Context context;

    private UserIconClickListener userIconClickListener;

    public EaseConversationAdapater(Context context, int resource,
            List<EMConversation> objects,UserIconClickListener userIconClickListener) {
        super(context, resource, objects);
        this.context=context;
        conversationList = objects;
        copyConversationList = new ArrayList<EMConversation>();
        this.userIconClickListener = userIconClickListener;
        copyConversationList.addAll(objects);
    }

    public void setChatMap(List<String>toplist){
        this.toplist=toplist;
    }

    @Override
    public int getCount() {
        return conversationList.size();
    }

    @Override
    public EMConversation getItem(int arg0) {
        if (arg0 < conversationList.size()) {
            return conversationList.get(arg0);
        }
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.ease_row_chat_history, parent, false);
        }
        ViewHolder holder = (ViewHolder) convertView.getTag();
        if (holder == null) {
            holder = new ViewHolder();
            holder.name = (TextView) convertView.findViewById(R.id.name);
            holder.unreadLabel = (TextView) convertView.findViewById(R.id.unread_msg_number);
            holder.message = (EmojiconTextView1) convertView.findViewById(R.id.message);
            holder.time = (TextView) convertView.findViewById(R.id.time);
            holder.avatar = (ImageView) convertView.findViewById(R.id.avatar);
            holder.msgState = convertView.findViewById(R.id.msg_state);
            holder.list_itease_layout = (RelativeLayout) convertView.findViewById(R.id.list_itease_layout);
            holder.icon_iv= (ImageView) convertView.findViewById(R.id.icon_iv);
            convertView.setTag(holder);
        }


        // 获取与此用户/群组的会话
        EMConversation conversation = getItem(position);
        // 获取用户username或者群组groupid
        String username = conversation.conversationId();

        if(toplist.contains(username)){
            holder.list_itease_layout.setBackgroundResource(R.drawable.ease_mm_listitem2);
        }else {
            holder.list_itease_layout.setBackgroundResource(R.drawable.ease_mm_listitem);
        }
        if (conversation.getType() == EMConversationType.GroupChat) {
            // 群聊消息，显示群聊头像
            final GroupChatBean userBean= (GroupChatBean) DaoHelper.getInstance(context, EaseConstant.DB_NAME_GROUP).getTypeId(GroupChatBeanDao.Properties.Ggimid,username);
            if(null!=userBean) {
                EaseUserUtils.setUserLogo(getContext(), userBean.getLogo(), holder.avatar);
                holder.name.setText(userBean.getGname());
            }else {
                holder.avatar.setImageResource(R.drawable.ease_group_icon);
                EMGroup group = EMClient.getInstance().groupManager().getGroup(username);
                holder.name.setText(group != null ? group.getGroupName() : username);
            }
            holder.avatar.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(userIconClickListener!=null){
                        userIconClickListener.onGroupIconClick(userBean);
                    }
                }
            });
        } else if(conversation.getType() == EMConversationType.ChatRoom){
            holder.avatar.setImageResource(R.drawable.ease_group_icon);
            EMChatRoom room = EMClient.getInstance().chatroomManager().getChatRoom(username);
            holder.name.setText(room != null && !TextUtils.isEmpty(room.getName()) ? room.getName() : username);
        }else {
            final UserBean userBean= (UserBean) DaoHelper.getInstance(context, EaseConstant.DB_NAME_CHAT).getTypeId(UserBeanDao.Properties.Imid,username);
//            if(null!=chatUserList&&null!=chatUserList.get(username)){
            if(null!=userBean){
                EaseUserUtils.setUserLogo(getContext(), userBean.getLogo(), holder.avatar);
                if(!"".equals(userBean.getUsername())){
                    EaseUserUtils.setUserNick(userBean.getUsername(), holder.name);
                }else
                    EaseUserUtils.setUserNick(userBean.getNick(), holder.name);
                if("0".equals(userBean.getUserauth())) {
                    holder.icon_iv.setImageResource(R.drawable.v_huan);
                    holder.icon_iv.setVisibility(View.VISIBLE);
                }else if("1".equals(userBean.getUserauth())){
                    holder.icon_iv.setImageResource(R.drawable.v_lan);
                    holder.icon_iv.setVisibility(View.VISIBLE);
                }else{
                    holder.icon_iv.setVisibility(View.GONE);
                }
                holder.avatar.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        if(userIconClickListener!=null){
                            userIconClickListener.onUserIconClick(userBean);
                        }
                    }
                });
                /*UserAuth auth=chatUserList.get(username).getUserAuth();
                if(null!=auth){
                    holder.icon_iv.setVisibility(View.VISIBLE);
                    if("0".equals(auth.getType())) {
                        holder.icon_iv.setBackgroundResource(R.drawable.v_huan);
                    }else if("1".equals(auth.getType())){
                        holder.icon_iv.setBackgroundResource(R.drawable.v_lan);
                    }else{
                        holder.icon_iv.setVisibility(View.GONE);
                    }
                }*/
            }
//            else {
//                EaseUserUtils.setUserAvatar(getContext(), username, holder.avatar);
//                EaseUserUtils.setUserNick(username, holder.name);
//                holder.icon_iv.setVisibility(View.GONE);
//            }
        }



        if (conversation.getUnreadMsgCount() > 0) {
            // 显示与此用户的消息未读数
            if(conversation.getUnreadMsgCount()>99){
                holder.unreadLabel.setText("99+条消息");
            }else
            holder.unreadLabel.setText(String.valueOf(conversation.getUnreadMsgCount())+"条消息");
            holder.unreadLabel.setVisibility(View.VISIBLE);
        } else {
            holder.unreadLabel.setVisibility(View.INVISIBLE);
        }

        if (conversation.getAllMsgCount() != 0) {
            // 把最后一条消息的内容作为item的message内容
            EMMessage lastMessage = conversation.getLastMessage();
            holder.message.setText( EaseCommonUtils.getMessageDigest(lastMessage, (this.getContext())));

            holder.time.setText(DateUtils.getTimestampString1(new Date(lastMessage.getMsgTime())));
            if (lastMessage.direct() == EMMessage.Direct.SEND && lastMessage.status() == EMMessage.Status.FAIL) {
                holder.msgState.setVisibility(View.VISIBLE);
            } else {
                holder.msgState.setVisibility(View.GONE);
            }
        }


        //设置自定义属性
//        holder.name.setTextColor(primaryColor);
//        holder.message.setTextColor(secondaryColor);
//        holder.time.setTextColor(timeColor);
//        if(primarySize != 0)
//            holder.name.setTextSize(TypedValue.COMPLEX_UNIT_PX, primarySize);
//        if(secondarySize != 0)
//            holder.message.setTextSize(TypedValue.COMPLEX_UNIT_PX, secondarySize);
//        if(timeSize != 0)
//            holder.time.setTextSize(TypedValue.COMPLEX_UNIT_PX, timeSize);

        return convertView;
    }
    
    @Override
    public void notifyDataSetChanged() {
        super.notifyDataSetChanged();
        if(!notiyfyByFilter){
            copyConversationList.clear();
            copyConversationList.addAll(conversationList);
            notiyfyByFilter = false;
        }
    }
    
    @Override
    public Filter getFilter() {
        if (conversationFilter == null) {
            conversationFilter = new ConversationFilter(conversationList);
        }
        return conversationFilter;
    }
    

    public void setPrimaryColor(int primaryColor) {
        this.primaryColor = primaryColor;
    }

    public void setSecondaryColor(int secondaryColor) {
        this.secondaryColor = secondaryColor;
    }

    public void setTimeColor(int timeColor) {
        this.timeColor = timeColor;
    }

    public void setPrimarySize(int primarySize) {
        this.primarySize = primarySize;
    }

    public void setSecondarySize(int secondarySize) {
        this.secondarySize = secondarySize;
    }

    public void setTimeSize(float timeSize) {
        this.timeSize = timeSize;
    }


    public interface UserIconClickListener {
        /**
         * 用户头像点击事件
         */
        void onUserIconClick(UserBean userBean);

        /**
         * 群头像点击事件
         */
        void onGroupIconClick(GroupChatBean userBean);
    }


    public void setUserIconClickListener(UserIconClickListener userIconClickListener) {
        this.userIconClickListener = userIconClickListener;
    }

    private class ConversationFilter extends Filter {
        List<EMConversation> mOriginalValues = null;

        public ConversationFilter(List<EMConversation> mList) {
            mOriginalValues = mList;
        }

        @Override
        protected FilterResults performFiltering(CharSequence prefix) {
            FilterResults results = new FilterResults();

            if (mOriginalValues == null) {
                mOriginalValues = new ArrayList<EMConversation>();
            }
            if (prefix == null || prefix.length() == 0) {
                results.values = copyConversationList;
                results.count = copyConversationList.size();
            } else {
                String prefixString = prefix.toString();
                final int count = mOriginalValues.size();
                final ArrayList<EMConversation> newValues = new ArrayList<EMConversation>();

                for (int i = 0; i < count; i++) {
                    final EMConversation value = mOriginalValues.get(i);
                    String username = value.conversationId();
                    
                    EMGroup group = EMClient.getInstance().groupManager().getGroup(username);
                    if(group != null){
                        username = group.getGroupName();
                    }else{
                        EaseUser user = EaseUserUtils.getUserInfo(username);
                        // TODO: not support Nick anymore
//                        if(user != null && user.getNick() != null)
//                            username = user.getNick();
                    }

                    // First match against the whole ,non-splitted value
                    if (username.startsWith(prefixString)) {
                        newValues.add(value);
                    } else{
                          final String[] words = username.split(" ");
                            final int wordCount = words.length;

                            // Start at index 0, in case valueText starts with space(s)
                            for (int k = 0; k < wordCount; k++) {
                                if (words[k].startsWith(prefixString)) {
                                    newValues.add(value);
                                    break;
                                }
                            }
                    }
                }

                results.values = newValues;
                results.count = newValues.size();
            }
            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            conversationList.clear();
            if (results.values != null) {
                conversationList.addAll((List<EMConversation>) results.values);
            }
            if (results.count > 0) {
                notiyfyByFilter = true;
                notifyDataSetChanged();
            } else {
                notifyDataSetInvalidated();
            }

        }

    }


    private static class ViewHolder {
        /** 和谁的聊天记录 */
        TextView name;
        /** 消息未读数 */
        TextView unreadLabel;
        /** 最后一条消息的内容 */
        EmojiconTextView1 message;
        /** 最后一条消息的时间 */
        TextView time;
        /** 用户头像 */
        ImageView avatar;
        /** 最后一条消息的发送状态 */
        View msgState;
        /** 整个list中每一行总布局 */
        RelativeLayout list_itease_layout;
        /***
         * 加v
         */
        ImageView icon_iv;

    }
}

